package cn.hss.Collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;

/**ArrayList和LinkedList查询性能比较分析
 * @author 作者：HeShaoShuai
 * @Email 邮箱：2569819541@qq.com
 * @Date 日期：2023/4/27 8:14
 * @Package 包名：cn.hss.Collection
 * @Project 项目名：JavaSE
 * @Version 1.0
 */
public class RandomAccess {
	public final static int COUNT=100000;
	public static void main(String[] args) {
		//创建ArrayList集合
		ArrayList<Integer> arrayList = new ArrayList<>();
		//创建LinkedList
		LinkedList<Integer> linkedList = new LinkedList<>();
		//动态为集合添加数据
		for(int i=0;i<COUNT;i++){
			arrayList.add(i);
			linkedList.add(i);
		}

		//LinkedList查询速度测试
//        linkedListAccess(linkedList);
//        //ArrayList集合查询速度测试
//        arrayListAccess(arrayList);
		//查询指定元素，来测试两者的查询效率
		//LinkedList查询指定元素，测试速度
		linkedListAccess(10000,linkedList);
		//ArrayList查询指定元素，测试速度
		arrayListAccess(10000,arrayList);
	}
	//测试ArrayList集合的查询速度
	private static void arrayListAccess(
			int num,ArrayList<Integer> arrayList) {
		long begin=System.currentTimeMillis();
		for(int i=0;i<arrayList.size();i++){
			if(arrayList.get(i)==num){
				System.out.println(num);
			}
		}
		long end = System.currentTimeMillis();
		System.out.println("ArrayList查找数据花费的时间为："+
				(end-begin));
	}
	//LinkedList查询指定元素，测试速度
	private static void linkedListAccess(
			int num,LinkedList<Integer> linkedList) {
		long begin=System.currentTimeMillis();
		for(int i=0;i<linkedList.size();i++){
			if(linkedList.get(i)==num){
				System.out.println(num);
			}
		}
		long end = System.currentTimeMillis();
		System.out.println("LinkedList查找数据花费的时间为："+
				(end-begin));
	}
	//LinkedList查询速度测试
	private static void linkedListAccess(
			LinkedList<Integer> linkedList) {
		long begin=System.currentTimeMillis();
		for(int i=0;i<linkedList.size();i++){
			//集合中的数据是有顺序的，所以可以使用二分查找法
			int index = Collections.binarySearch(
					linkedList, linkedList.get(i));
			if(index != i){
				System.out.println("ERROR");
			}
		}
		long end = System.currentTimeMillis();
		System.out.println("LinkedList查找数据花费的时间为："+
				(end-begin));
	}

	//测试ArrayList集合的查询速度
	private static void arrayListAccess(
			ArrayList<Integer> arrayList) {
		long begin=System.currentTimeMillis();
		for(int i=0;i<arrayList.size();i++){
			//集合中的数据是有顺序的，所以可以使用二分查找法
			int index = Collections.binarySearch(
					arrayList, arrayList.get(i));
			if(index != i){
				System.out.println("ERROR");
			}
		}
		long end = System.currentTimeMillis();
		System.out.println("ArrayList查找数据花费的时间为："+
				(end-begin));
	}
}